package com.wy._02io.fileUtil;

import com.wy.Exception.FileTypeException;
import com.wy._00const.CharacterEn;
import com.wy._02io.enums.FileTypeEnum;

import java.io.*;

//这个类里面的方法是为了得到文件信息

/**
 * 对于计算机来说，我们可以看到一个文件的后缀和名字，我们会根据后缀来判断这个文件的类型，但是实际上，不同后缀仅仅是为了让计算机识别
 * 然后使用不同的编辑器来进行执行这个价脚本，或者显示，或者执行，实际上，不应该这样，在真实的文件内容，文件的前几个内容的字节，里面记录了实际的
 * 文件类型信息，通过这个信息来判断文件的类型是最正确的，因为这个不像后缀一样容易被修改。
 */
public class FileInfo {
    /**
     * 得到文件类型根据文件后缀
     *
     * @param file 传入文件对象
     * @return 返回文件类型
     */
    public static FileTypeEnum getFileTypeByFileName(File file) {
        if (!CheckFile.checkFile(file)) {
            throw new FileTypeException();
        }
        String fileName = file.getName();
        int lastPointIndex = fileName.lastIndexOf(CharacterEn.POINT);
        String suffix = fileName.substring(lastPointIndex + 1);
        String suffixToUpperCase = suffix.toUpperCase();
        for (FileTypeEnum value : FileTypeEnum.values()) {
            if (value.toString().equals(suffixToUpperCase)) {
                return value;
            }
        }
        return FileTypeEnum.UN_KNOWN;
    }

    /**
     * 得到文件类型通过文件内容信息
     *
     * @param file
     * @return
     */
    public static FileTypeEnum getFileTypeByFileInfo(File file) {
        String fileMagic = getFileMagic(file);
        FileTypeEnum fileTypeEnum = FileTypeEnum.UN_KNOWN;
        for (FileTypeEnum value : FileTypeEnum.values()) {
            if (value.getMagicNumber().equals(fileMagic)) {
                fileTypeEnum = value;
            }
        }
        return fileTypeEnum;
    }

    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\新建文件夹");
        for (File listFile : file.listFiles()) {
//            String fileMagic = getFileMagic(listFile);
//            System.out.println(listFile.getName() + " 文件的 魔数1 是：" + fileMagic);
            String fileMagic2 = getFileMagic2(listFile);
            System.out.println(listFile.getName() + " 文件的 魔数2 是：" + fileMagic2);
        }
    }

    /**
     * 得到文件魔数的值
     *
     * @param file 文件
     * @return 返回魔数值
     */
    public static String getFileMagic(File file) {
        byte[] buffer = new byte[8];
        try {
            FileInputStream fis = new FileInputStream(file);
            fis.read(buffer, 0, buffer.length);
        } catch (IOException e) {
            e.printStackTrace();
        }
        StringBuilder hexStr = new StringBuilder();
        for (byte b : buffer) {
            String hex = Integer.toHexString(0xff & b);
            if (hex.length() == 1) {
                hexStr.append('0');
            }
            hexStr.append(hex);
        }
        String magicStr = hexStr.toString().toUpperCase();
        return magicStr;
    }

    public static String getFileMagic2(File file) {
        byte[] b = new byte[28];
        InputStream inputStream = null;

        try {
            inputStream = new FileInputStream(file);
            inputStream.read(b, 0, 28);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        StringBuilder builder = new StringBuilder();

        for (int i = 0; i < b.length; i++) {
            int v = b[i] & 0xFF;
            String hv = Integer.toHexString(v);
            if (hv.length() < 2) {
                builder.append(0);
            }
            builder.append(hv);
        }
        return builder.toString();
    }
}
